package xverify

import (
	"fmt"
	"regexp"
	"strconv"
	"time"
)

// CheckIdCard 检验身份证并返回年龄
func CheckIdCard(card string) (bool, int) {
	if len(card) != 15 && len(card) != 18 {
		return false, 0
	}

	// 18位身份证 ^(\d{17})([0-9]|X)$
	// 匹配规则
	// (^\d{15}$) 15位身份证
	// (^\d{18}$) 18位身份证
	// (^\d{17}(\d|X|x)$) 18位身份证 最后一位为X的用户
	regRuler := "(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)"

	// 正则调用规则
	reg := regexp.MustCompile(regRuler)

	// 返回 MatchString 是否匹配
	if !reg.MatchString(card) {
		return false, 0
	}

	return true, getAgeByBirthday(getBirthday(card))
}

// getBirthday 根据身份证获取对应生日
func getBirthday(cardId string) string {
	// 兼容第一代15位身份证号码
	if len(cardId) == 15 {
		// 第一代身份证年份都是19开头的
		return fmt.Sprintf("19%s", cardId[6:12])
	} else {
		return cardId[6:14]
	}
}

// getAgeByBirthday 根据生日日期得到用户年龄
func getAgeByBirthday(birthday string) int {
	year, _ := strconv.Atoi(birthday[0:4])
	month, _ := strconv.Atoi(birthday[4:6])
	day, _ := strconv.Atoi(birthday[6:])

	// 计算当前日期与生日中年月日都差值
	now := time.Now()
	age := now.Year() - year
	moreMonth := int(now.Month()) - month
	moreDay := now.Day() - day

	// 未到生日月份，或者到了月份，但未到生日日期，年龄都要减1岁
	if moreMonth < 0 || (moreMonth == 0 && moreDay < 0) {
		age--
	}
	// 不要出现负值
	if age < 0 {
		age = 0
	}

	return age
}
